package com.hxzy.common.swagger;

import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * 这个访问  http://localhost:8080/swagger-ui.html
 *
 * @author tonneyyy
 */
@Configuration
@EnableConfigurationProperties(SwaggerPropereties.class)   //  把自定义SwaggerPropereties.java加载到spring容器中去
@EnableSwagger2
public class SwaggerConfig {


    /**
     * 自动装配 SwaggerPropereties  ，如果没有 定义@EnableConfigurationProperties(SwaggerPropereties.class) 空指令
     */
    @Autowired
    private SwaggerPropereties  swaggerPropereties;


    @Bean
    public Docket docket() {
        // 以下的配置，每一个请求，都要推荐一个令牌表单字段
//        //添加通用参数的集合
//        List<Parameter> parameters=new ArrayList<>();
//        // 1、创建一个header 通用参数
//        ParameterBuilder tokenBuilder=new ParameterBuilder();
//        tokenBuilder.name("Authorization")
//                .description("令牌")
//                .modelRef(new ModelRef("string"))
//                .parameterType("header")
//                .required(false).build();
//
//        parameters.add(tokenBuilder.build());


//        Docket docket = new Docket(DocumentationType.SWAGGER_2)
//                .apiInfo(apiInfo())
//                //配置全局额外的参数
//                // .enable(false) //配置是否启用Swagger，如果是false，在浏览器将无法访问
//                //配置全局额外的参数
//                .globalOperationParameters(parameters)
//                .select()// 通过.select()方法，去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//                //配置你想在那个controller层生产接口文档
//                .paths(PathSelectors.any())
//                .build();
//        return  docket;

        // 以下是配置全局的令牌操作
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                //配置全局额外的参数
                // .enable(false) //配置是否启用Swagger，如果是false，在浏览器将无法访问
                //配置全局额外的参数
                //.globalOperationParameters(parameters)
                .select()// 通过.select()方法，去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                //配置你想在那个controller层生产接口文档
                .paths(PathSelectors.any())
                .build();

        ApiKey apiKey = new ApiKey("Authorization", "Authorization", "header");
        List<ApiKey> apiKeyList = new ArrayList<>();
        apiKeyList.add(apiKey);
        docket.securitySchemes(apiKeyList);

        AuthorizationScope scope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] scopes = {scope};
        SecurityReference reference = new SecurityReference("Authorization", scopes);
        List refList = new ArrayList();
        refList.add(reference);
        SecurityContext context = SecurityContext.builder().securityReferences(refList).build();
        List cxtList = new ArrayList();
        cxtList.add(context);
        docket.securityContexts(cxtList);

        return docket;
    }

    //配置文档信息
    private ApiInfo apiInfo() {
        Contact contact = new Contact(this.swaggerPropereties.getTitle(), this.swaggerPropereties.getLicenseUrl(), this.swaggerPropereties.getEmail());

        return new ApiInfo(
                this.swaggerPropereties.getTitle(), // 标题
                this.swaggerPropereties.getDescription(), // 描述
                this.swaggerPropereties.getVersion(), // 版本
                this.swaggerPropereties.getTermsOfServiceUrl(), // 组织链接
                contact, // 联系人信息
                 this.swaggerPropereties.getLicense(), // 许可
                this.swaggerPropereties.getLicenseUrl(), // 许可连接
                new ArrayList<>()// 扩展
        );
    }
}